/*
 * AutoreleasePool.h
 *
 *  Created on: 2013-6-23
 *  Author: xnan
 */

#ifndef XNL_AUTORELEASEPOOL_H_
#define XNL_AUTORELEASEPOOL_H_

#include <list>
#include "Object.h"

NS_XNL_BEGIN

/*
 * 自动释放池 -- 单例
 */
class AutoreleasePool : public Object
{
    AutoreleasePool();
    
public:
    
    virtual ~AutoreleasePool();
    
    /*
     * 添加需要自动释放的对象
     */
    void addObject( Object * p_object );
    
    /*
     * 移除对象
     * 将对象从自动释放池中移除
     * 即不再检测对象是否可以释放;
     * 一般用于XNObject对象的析构函数中,
     * 对象在释放的时候同时也删除内存池中对这个对象的引用.
     * 所以在正常情况下,尽量甚至不要直接调用此函数
     */
    void removeObject( Object * p_object );
    
    /*
     * 执行自动释放池检测
     * 确定哪些对象应该被释放,
     * 并且立刻执行释放操作.
     * 此函数一般在程序的主循环(如消息循环)中调用,
     * 只要确保程序在每一次主循环中都能执行此函数即可.
     * 调用此函数的代价可能会比较大,所以应该在主循环之外的
     * 地方尽量不要调用此函数
     */
    void runClear();
    
    static AutoreleasePool * instance();
    
protected:
    std::list<Object*> m_pool;
    
private:
    static AutoreleasePool * m_instance;
};

NS_XNL_END

#endif /* XNL_AUTORELEASEPOOL_H_ */
